Das Abschlussprojekt besteht aus 2. Teilen, wobei der 1.Teil 30% und der 2.Teil 70% in der Gewichtung ausmacht.
Die Dokumentation und Beantwortung der Fragen kann in englisch oder deutsch erfolgen.
Im 2.Teil soll eine explorative Datenanalyse durchgeführt werden. Dafür ist der Datensatz zunächst vorzubereiten. In die Bewertung geht zudem die Dokumentation mit ein. Für die Visualisierung sind 3 verschiedenartige Plots zu benennen, die in die Bewertung eingehen sollen. Vergiss dabei nicht die Erkenntnisse die aus jedem Plot gezogen werden können, zu notieren.
Am Freitag erfolgt die Vorstellung der Plots innerhalb des Zeitrahmens von 5min (+-1min) ist dabei ok.
Treff ist Donnerstag um 16:00 Uhr im Hauptraum. Da werden wir die Unterlagen in dokumentsichere Formate umwandeln. Das machen wir aber zusammen. Danach habt ihr bis 17:10 Uhr zeit, eure zu bewertenden Unterlagen in den Projektabgabeordner hochzuladen.
Erkläre die 4 V´s mit deinen eigenen Worten anhand eines Beispiels. Vergiss dabei nicht die 4 V´s thematisch einzuordnen.
Die 4 V's dienen dazu abzuschätzen, ob ein Big Data Thema vorliegt.
a.) Erkläre anhand eines selbstgewählten Beispiels was fehlende Werte sind.
Ein Temperatursensor ist ausgefallen und kann keine Temperatur mehr messen. Im Messprotokoll sind ab Zeitpunkt des Ausfalls fehlende Angaben, sprich keine Zahlen hinterlegt, z.B. NaN (not a number) oder '-'. Es können auch Synonyme sein, wie '?', 'missing'.
b.) Warum muss sich bei der Datenanalyse damit beschäftigt werden?
Weil man damit eine Lücke in den Daten hat. Für die spätere Visualisierung werden fehlende Werte wie gelöscht angesehen. Es könenn auch keine Berechnungen durchgeführt werden. Daher ist zu überlegen, ob man die gesamte Zeile löscht mit dem Risiko von Datenverlust, oder man befüllt die fehlenden Werte, bspw. mit dem Mittelwert der Temperatur vor und nach dem Ausfall des Sensors oder man ersetzt sie mit Daten von einem anderen Sensor.
c.) Wie können fehlende Werte in der Datenanalyse identifiziert werden?
.isnull().sum(): Anzahl systemseitig erkannter NaN Werte.info(): welche Datentypen und ob NaN Werte vorliegen.unique(): Anzeige einzigartiger Werte, um ein Synonym zu identifizierenastype(float), dann wird ein Fehler bei einem Synonym ausgegeben..nunique(): Abgleich mit .unique().describe(): Kommawerte oder Negativwerte bei ganzzahligen Spalten, oder unsinnig hohe Werte.min(): Minimumwerte, die nicht erwartet werden, können fehlende Werte sein..max(): Maximumwerte, die nicht erwartet wurden, können fehlende Werte sein..dtypes: Wenn Zahlen Spalten vom Typ Object Typ sind, ist das ein Hinweis, dass dort Strings enthalten sind (Synonyme)Du arbeitest als Data Scientist in einem Start Up. Ihr habt vor einem Jahr euer Geschäft eröffnet und nun wollt ihr den nächsten Schritt gehen und eure Dienste erweitern. Euer Geschäftsmodell ist das Betreiben einer Plattform bei der sich Personen die eine Geschäftsidee haben, aber nicht das benötigte Geld, anmelden und für ihr Projekt innerhalb einer vorgegebenen Zeit Geld sammeln können. Auf der anderen Seite habt ihr Geldgeber, die gern ihr Geld in Projekte anlegen möchten und nach Investitionen suchen. Als Vermittler bringt eure Plattform also Geldnehmer und Geldgeber zusammen. Ihr verdient euer Geld mit einer Provision für jedes Projekt was auf eurer Plattform landet.
Deine Datenbasis ist die Historie eurer Plattform. Alle Projekte sind abgeschlossene Projekte, d.h. die Zeit, um für sein Projekt Geld zu sammeln ist abgelaufen. Euer Geschäftsmodell sieht es vor, dass die gesammelten Gelder ausgezahlt werden, auch wenn der Zielbetrag nicht erreicht wurde.
In dem Datensatz gibt es KEINE Duplikate.
Der gesplittete Datensatz enthält folgende Spalten (inkl. Bedeutung):
- funded_amount ... mit Ablauf der Crowdfundingzeit erhaltener Betrag/ ausgezahlter Betrag in USD
- loan_amount ... Zielbetrag (Betrag dem man mit Funding erreichen wollte) in USD
- activity ... Unterkategory zu dem das Ziel des Crowdfunding thematisch gehört
- sector ... Oberkategory in den das Crowdfunding Thema fällt
- use ... Kurzbeschreibung wofür das Geld verwendet werden soll
- country_code ... Ländercode nach ISO Norm
- country ... Ländername nach ISO Norm
- region ... Region
- currency ... Währung in den der funded_amount dann ausgezahlt wurde
- term in months ... Dauer über die der Kredit ausgezahlt werden soll
- lender_count ...Darlehensgeber (also wieviele Personen Geld für das Projekt gegeben haben)
- borrower_genders ... Geschlecht und Anzahl der Darlehensnehmer, also diejenigen die das Crowdfundingprojekt initiiert haben
- repayment interval ... Rückzahlungsmodalitäten/-rhythmus
#Bibliotheken laden
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import plotly_express as px
df1 = pd.read_csv('part1.csv',
sep='\n',
nrows=2
)
df1
| ,funded_amount,loan_amount,activity,sector,use,country_code,country,region,currency,term_in_months,lender_count,borrower_genders,repayment_interval | |
|---|---|
| 0 | 0,300.0,300.0,Fruits & Vegetables,Food,"To buy... |
| 1 | 1,575.0,575.0,Rickshaw,Transportation,to repai... |
df2 = df1 = pd.read_csv('part2.csv',
sep='\n',
nrows=2
)
df2
| #funded_amount#loan_amount#activity#sector#use#country_code#country#region#currency#term_in_months#lender_count#borrower_genders#repayment_interval | |
|---|---|
| 0 | 0#175.0#175.0#Liquor Store / Off-License#Food#... |
| 1 | 1#325.0#325.0#Livestock#Agriculture#to buy 3 z... |
Beide Dateien haben unterschiedliche Separator. Part1 das Komma, Part2 die Raute. Folgend werden beide mit dem korrekten Separator geladen.
df1 = pd.read_csv('part1.csv',
sep=',',
index_col=0
)
df1.head(5)
| funded_amount | loan_amount | activity | sector | use | country_code | country | region | currency | term_in_months | lender_count | borrower_genders | repayment_interval | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 300.0 | 300.0 | Fruits & Vegetables | Food | To buy seasonal, fresh fruits to sell. | PK | Pakistan | Lahore | PKR | 12.0 | 12 | female | irregular |
| 1 | 575.0 | 575.0 | Rickshaw | Transportation | to repair and maintain the auto rickshaw used ... | PK | Pakistan | Lahore | PKR | 11.0 | 14 | female, female | irregular |
| 2 | 150.0 | 150.0 | Transportation | Transportation | To repair their old cycle-van and buy another ... | IN | India | Maynaguri | INR | 43.0 | 6 | female | bullet |
| 3 | 200.0 | 200.0 | Embroidery | Arts | to purchase an embroidery machine and a variet... | PK | Pakistan | Lahore | PKR | 11.0 | 8 | female | irregular |
| 4 | 400.0 | 400.0 | Milk Sales | Food | to purchase one buffalo. | PK | Pakistan | Abdul Hakeem | PKR | 14.0 | 16 | female | monthly |
df1.tail(5)
| funded_amount | loan_amount | activity | sector | use | country_code | country | region | currency | term_in_months | lender_count | borrower_genders | repayment_interval | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 334995 | 7125.0 | 7125.0 | Plastics Sales | Retail | to stock up with a dozen plastic tubs and buck... | CD | The Democratic Republic of the Congo | Goma, North Kivu province | USD | 6.0 | 15 | female, female, female, female, female, female... | irregular |
| 334996 | 125.0 | 125.0 | Home Appliances | Personal Use | to buy a water filter to provide safe drinking... | KH | Cambodia | Phnom Penh | KHR | 8.0 | 5 | male, male, male | monthly |
| 334997 | 925.0 | 925.0 | Cattle | Agriculture | to increase his herd to get more milk and prov... | TJ | Tajikistan | Khuroson | TJS | 14.0 | 28 | male | monthly |
| 334998 | 175.0 | 175.0 | General Store | Retail | to buy additional items to sell, like beverage... | PH | Philippines | Palo, Leyte | PHP | 8.0 | 6 | female | irregular |
| 334999 | 150.0 | 150.0 | Food Production/Sales | Food | to buy sticky rice and sugar. | PH | Philippines | Jagna, Bohol | PHP | 8.0 | 5 | female | irregular |
df2 = pd.read_csv('part2.csv',
sep='#',
index_col=0
)
df2.head(5)
| funded_amount | loan_amount | activity | sector | use | country_code | country | region | currency | term_in_months | lender_count | borrower_genders | repayment_interval | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 175.0 | 175.0 | Liquor Store / Off-License | Food | to purchase additional stock of coconut wine t... | PH | Philippines | Palo, Leyte | PHP | 8.0 | 6 | female | irregular |
| 1 | 325.0 | 325.0 | Livestock | Agriculture | to buy 3 zebus and food to fatten them up. | MG | Madagascar | Antsirabe | MGA | 12.0 | 13 | female | monthly |
| 2 | 550.0 | 550.0 | Food Stall | Food | to buy ingredients for her food-vending busine... | PH | Philippines | Cordova, Cebu | PHP | 5.0 | 6 | female | irregular |
| 3 | 1300.0 | 1300.0 | Cattle | Agriculture | to buy one head of cattle. | EG | Egypt | Baniswef | EGP | 14.0 | 50 | male | monthly |
| 4 | 900.0 | 900.0 | Consumer Goods | Personal Use | to buy consumer goods amongst others. | PE | Peru | Urubamba - Urubamba - Cusco | PEN | 6.0 | 1 | female | irregular |
df2.tail(5)
| funded_amount | loan_amount | activity | sector | use | country_code | country | region | currency | term_in_months | lender_count | borrower_genders | repayment_interval | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 336200 | 0.0 | 25.0 | Livestock | Agriculture | [True, u'para compara: cemento, arenya y ladri... | PY | Paraguay | Concepción | USD | 13.0 | 0 | female | monthly |
| 336201 | 25.0 | 25.0 | Livestock | Agriculture | [True, u'to start a turducken farm.'] - this l... | KE | Kenya | NaN | KES | 13.0 | 1 | female | monthly |
| 336202 | 0.0 | 25.0 | Games | Entertainment | NaN | KE | Kenya | NaN | KES | 13.0 | 0 | NaN | monthly |
| 336203 | 0.0 | 25.0 | Livestock | Agriculture | [True, u'to start a turducken farm.'] - this l... | KE | Kenya | NaN | KES | 13.0 | 0 | female | monthly |
| 336204 | 0.0 | 25.0 | Livestock | Agriculture | [True, u'to start a turducken farm.'] - this l... | KE | Kenya | NaN | KES | 13.0 | 0 | female | monthly |
df1.dtypes
funded_amount float64 loan_amount float64 activity object sector object use object country_code object country object region object currency object term_in_months float64 lender_count int64 borrower_genders object repayment_interval object dtype: object
df2.dtypes
funded_amount float64 loan_amount float64 activity object sector object use object country_code object country object region object currency object term_in_months float64 lender_count int64 borrower_genders object repayment_interval object dtype: object
df1.columns
Index(['funded_amount', 'loan_amount', 'activity', 'sector', 'use',
'country_code', 'country', 'region', 'currency', 'term_in_months',
'lender_count', 'borrower_genders', 'repayment_interval'],
dtype='object')
df2.columns
Index(['funded_amount', 'loan_amount', 'activity', 'sector', 'use',
'country_code', 'country', 'region', 'currency', 'term_in_months',
'lender_count', 'borrower_genders', 'repayment_interval'],
dtype='object')
df1.shape, df2.shape
((335000, 13), (336205, 13))
# Kontrolle welche Größe neuer Dataframe durch Joinen haben müsste
len(df1)+len(df2)
671205
Beide Dataframes können zeilenweise gemerged werden, da sie die gleiche Struktur haben, die selben Spaltennamen, die selben Datentypen. Aus irgendeinem Grund erzeugt .merge() mit how='outer' mehr Zeilen als beide Dataframes zusammen haben müssten. Das Problem wird durch die .concat() Funktion gelöst.
# beide Dataframes können zeilenweise gemerged werden,
# da sie die gleiche Struktur haben, die selben Spaltennamen, die selben Datentypen
df_funds = pd.concat([df1, df2])
df_funds.shape
(671205, 13)
# selbes Ergebnis wie bei df1.head()
df_funds.head()
| funded_amount | loan_amount | activity | sector | use | country_code | country | region | currency | term_in_months | lender_count | borrower_genders | repayment_interval | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 300.0 | 300.0 | Fruits & Vegetables | Food | To buy seasonal, fresh fruits to sell. | PK | Pakistan | Lahore | PKR | 12.0 | 12 | female | irregular |
| 1 | 575.0 | 575.0 | Rickshaw | Transportation | to repair and maintain the auto rickshaw used ... | PK | Pakistan | Lahore | PKR | 11.0 | 14 | female, female | irregular |
| 2 | 150.0 | 150.0 | Transportation | Transportation | To repair their old cycle-van and buy another ... | IN | India | Maynaguri | INR | 43.0 | 6 | female | bullet |
| 3 | 200.0 | 200.0 | Embroidery | Arts | to purchase an embroidery machine and a variet... | PK | Pakistan | Lahore | PKR | 11.0 | 8 | female | irregular |
| 4 | 400.0 | 400.0 | Milk Sales | Food | to purchase one buffalo. | PK | Pakistan | Abdul Hakeem | PKR | 14.0 | 16 | female | monthly |
# selbes Ergebnis wie bei df2.tail()
df_funds.tail()
| funded_amount | loan_amount | activity | sector | use | country_code | country | region | currency | term_in_months | lender_count | borrower_genders | repayment_interval | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 336200 | 0.0 | 25.0 | Livestock | Agriculture | [True, u'para compara: cemento, arenya y ladri... | PY | Paraguay | Concepción | USD | 13.0 | 0 | female | monthly |
| 336201 | 25.0 | 25.0 | Livestock | Agriculture | [True, u'to start a turducken farm.'] - this l... | KE | Kenya | NaN | KES | 13.0 | 1 | female | monthly |
| 336202 | 0.0 | 25.0 | Games | Entertainment | NaN | KE | Kenya | NaN | KES | 13.0 | 0 | NaN | monthly |
| 336203 | 0.0 | 25.0 | Livestock | Agriculture | [True, u'to start a turducken farm.'] - this l... | KE | Kenya | NaN | KES | 13.0 | 0 | female | monthly |
| 336204 | 0.0 | 25.0 | Livestock | Agriculture | [True, u'to start a turducken farm.'] - this l... | KE | Kenya | NaN | KES | 13.0 | 0 | female | monthly |
# Resetten des Index, da Index von df2 nur angehängt wurde
df_funds.reset_index(inplace=True, drop=True)
df_funds.tail()
| funded_amount | loan_amount | activity | sector | use | country_code | country | region | currency | term_in_months | lender_count | borrower_genders | repayment_interval | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 671200 | 0.0 | 25.0 | Livestock | Agriculture | [True, u'para compara: cemento, arenya y ladri... | PY | Paraguay | Concepción | USD | 13.0 | 0 | female | monthly |
| 671201 | 25.0 | 25.0 | Livestock | Agriculture | [True, u'to start a turducken farm.'] - this l... | KE | Kenya | NaN | KES | 13.0 | 1 | female | monthly |
| 671202 | 0.0 | 25.0 | Games | Entertainment | NaN | KE | Kenya | NaN | KES | 13.0 | 0 | NaN | monthly |
| 671203 | 0.0 | 25.0 | Livestock | Agriculture | [True, u'to start a turducken farm.'] - this l... | KE | Kenya | NaN | KES | 13.0 | 0 | female | monthly |
| 671204 | 0.0 | 25.0 | Livestock | Agriculture | [True, u'to start a turducken farm.'] - this l... | KE | Kenya | NaN | KES | 13.0 | 0 | female | monthly |
df_funds.info() # welche Datentypen und ob NaN Werte vorliegen
<class 'pandas.core.frame.DataFrame'> RangeIndex: 671205 entries, 0 to 671204 Data columns (total 13 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 funded_amount 671205 non-null float64 1 loan_amount 671205 non-null float64 2 activity 671205 non-null object 3 sector 671205 non-null object 4 use 666973 non-null object 5 country_code 671197 non-null object 6 country 671205 non-null object 7 region 614405 non-null object 8 currency 671205 non-null object 9 term_in_months 671205 non-null float64 10 lender_count 671205 non-null int64 11 borrower_genders 666984 non-null object 12 repayment_interval 671205 non-null object dtypes: float64(3), int64(1), object(9) memory usage: 66.6+ MB
df_funds.isnull().sum() # Anzahl systemseitig erkannter NaN Werte
funded_amount 0 loan_amount 0 activity 0 sector 0 use 4232 country_code 8 country 0 region 56800 currency 0 term_in_months 0 lender_count 0 borrower_genders 4221 repayment_interval 0 dtype: int64
df_funds.describe() # kleine Statis. Übersicht
# hier müssten alle numerischen Spalten aufgelistet sein
| funded_amount | loan_amount | term_in_months | lender_count | |
|---|---|---|---|---|
| count | 671205.000000 | 671205.000000 | 671205.000000 | 671205.000000 |
| mean | 785.995061 | 842.397107 | 13.739022 | 20.590922 |
| std | 1130.398941 | 1198.660073 | 8.598919 | 28.459551 |
| min | 0.000000 | 25.000000 | 1.000000 | 0.000000 |
| 25% | 250.000000 | 275.000000 | 8.000000 | 7.000000 |
| 50% | 450.000000 | 500.000000 | 13.000000 | 13.000000 |
| 75% | 900.000000 | 1000.000000 | 14.000000 | 24.000000 |
| max | 100000.000000 | 100000.000000 | 158.000000 | 2986.000000 |
# # Pairplot
# my_pairplot = sns.pairplot(data=df_funds,
# corner=True,
# hue='sector'
# )
fig = px.scatter_matrix(df_funds,
color="sector",
dimensions=['funded_amount', 'loan_amount', 'term_in_months', 'lender_count']
)
fig.show()